﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using EntidadesDeNegocio;

namespace ObliDisenoAplicaciones.Interfaz
{
    public partial class AgregarModificarComp : Form
    {
        /// <summary>
        /// Mantiene el componente que se envia desde la ventana de mantenimiento
        /// </summary>
        private Componente Comp = null;
        /// <summary>
        /// Propiedad que se setea cuando se esta cargando el formulario
        /// </summary>
        private bool _Inicio = false;

        public AgregarModificarComp(Componente comp)
        {
            InitializeComponent();            
            Comp = comp;
            _Inicio = true;
            this.cmbMedio.DataSource = Enum.GetValues(typeof(MedioComponente));
            this.cmbMedio.SelectedIndex = -1;            
            if (Comp != null)
            {
                this.Text = "Modificar Componente";
                this.txtModelo.Enabled = false;
                this.txtNumeroSerie.Enabled = false;
                this.cmbMedio.Enabled = false;
                this.dTPFechaCreacion.Enabled = false;
                this.dTPFechaService.Enabled = false;
                txtNumeroSerie.Text = Comp.NumeroSerie;
                txtModelo.Text = Comp.Modelo;
                txtDescripcion.Text = Comp.Descripcion;                
                txtCosto.Text = Comp.Costo.ToString();
                txtCantidad.Text = Comp.Cantidad.ToString();
                dTPFechaCreacion.Value = Comp.FechaCreacion;
                dTPFechaService.Value = Comp.FechaService;
                switch (Comp.Medio)
                {
                    case MedioComponente.Acuatico:
                        this.cmbMedio.SelectedItem = MedioComponente.Acuatico;
                        txtTemperatura.Enabled = false;
                        txtAltitud.Enabled = false;
                        txtVelocidad.Enabled = false;
                        if (Comp.GetTipo() == TipoComponente.PiezaAcuatica)
                            this.txtProfundidad.Text = ((PiezaAcuatica)Comp).Profundidad.ToString();
                        break;
                    case MedioComponente.Terrestre:
                        this.cmbMedio.SelectedItem = MedioComponente.Terrestre;
                        txtProfundidad.Enabled = false;
                        txtAltitud.Enabled = false;
                        txtVelocidad.Enabled = false;
                        if (Comp.GetTipo() == TipoComponente.PiezaTerrestre)
                            this.txtTemperatura.Text = ((PiezaTerrestre)Comp).Temperatura.ToString();
                        break;
                    case MedioComponente.Aereo:
                        this.cmbMedio.SelectedItem = MedioComponente.Aereo;
                        txtProfundidad.Enabled = false;
                        txtTemperatura.Enabled = false;
                        if (Comp.GetTipo() == TipoComponente.PiezaAerea)
                        {
                            this.txtAltitud.Text = ((PiezaAerea)Comp).Altitud.ToString();
                            this.txtVelocidad.Text = ((PiezaAerea)Comp).Velocidad.ToString();
                        }
                        break;
                    default:
                        break;
                }
                if (Comp.GetTipo() == TipoComponente.Robot)
                {
                    txtProfundidad.Enabled = false;
                    txtTemperatura.Enabled = false;
                    txtAltitud.Enabled = false;
                    txtVelocidad.Enabled = false;
                    txtCosto.Enabled = false;
                    txtCantidad.Enabled = false;
                    txtDescripcion.Enabled = false;
                }                
                
            }
            else 
            {
                this.Text = "Agregar Componente";
            }
            _Inicio = false;
        }
        /// <summary>
        /// Limpia los campos de la ventana
        /// </summary>
        private void LimpiaCampos() 
        {
            txtCantidad.Text = "0";
            txtCosto.Text = "0,0";
            txtDescripcion.Text = string.Empty;
            txtModelo.Text = string.Empty;
            txtNumeroSerie.Text = string.Empty;
            cmbMedio.SelectedIndex = -1;
            txtTemperatura.Text = "0,0";
            txtProfundidad.Text = "0,0";
            txtVelocidad.Text = "0,0";
            txtAltitud.Text = "0,0";
        }
        /// <summary>
        /// Guardo o actualizo el componente
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (ValidarCampos())
            {
                if (Comp == null)
                {
                    Stock.Instancia.AgregarComponente(txtModelo.Text, txtNumeroSerie.Text, (MedioComponente)cmbMedio.SelectedItem, decimal.Parse(txtCosto.Text), txtDescripcion.Text, dTPFechaCreacion.Value, int.Parse(txtCantidad.Text), dTPFechaService.Value, false, decimal.Parse(txtTemperatura.Text), decimal.Parse(txtProfundidad.Text),decimal.Parse(txtAltitud.Text),decimal.Parse(txtVelocidad.Text),null);
                }
                else
                {
                    Stock.Instancia.ModificarComponente(txtModelo.Text, txtNumeroSerie.Text, (MedioComponente)cmbMedio.SelectedItem, decimal.Parse(txtCosto.Text), txtDescripcion.Text, dTPFechaCreacion.Value, int.Parse(txtCantidad.Text), dTPFechaService.Value, Comp.GetTipo() == TipoComponente.Robot, decimal.Parse(txtTemperatura.Text), decimal.Parse(txtProfundidad.Text),decimal.Parse(txtAltitud.Text),decimal.Parse(txtVelocidad.Text));                    
                }
                LimpiaCampos();
                Sistema.Instancia.ActualizarTodo(Sistema.Instancia);
                this.Dispose();
            }
        }
        /// <summary>
        /// Valido campos requeridos
        /// </summary>
        /// <returns></returns>
        public bool ValidarCampos() 
        {
            bool res = false;
            Regex reg = new Regex(@"^[0-9]*(\,[0-9]+)?$");
            if (reg.IsMatch(txtAltitud.Text))
            {
                res = true;
            }
            else
            {
                MessageBox.Show("El campo Altitud no tiene el formato correcto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            if (reg.IsMatch(txtVelocidad.Text))
            {
                res = true;
            }
            else
            {
                MessageBox.Show("El campo Velocidad no tiene el formato correcto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }            
            if(reg.IsMatch(txtCosto.Text))
            {
                res = true;
            }
            else 
            {
                MessageBox.Show("El campo Costo no tiene el formato correcto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            try 
            {
                Int32.Parse(txtCantidad.Text);
            }
            catch(Exception)
            {
                MessageBox.Show("El campo cantidad no tiene el formato correcto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            if (int.Parse(txtCantidad.Text) > 0)
            {
                res = true;
            }
            else 
            {
                MessageBox.Show("El campo cantidad debe ser mayor a 0", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            if (reg.IsMatch(txtTemperatura.Text))
            {
                res = true;
            }
            else
            {
                MessageBox.Show("El campo Temperatura no tiene el formato correcto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            if (reg.IsMatch(txtProfundidad.Text))
            {
                res = true;
            }
            else
            {
                MessageBox.Show("El campo Profundidad no tiene el formato correcto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }            
            if (txtModelo.Text == string.Empty || txtModelo.Text == null)
            {
                MessageBox.Show("Campo Modelo vacio, debe ingresar un modelo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;                
            }
            else
                res = true;
            if (txtNumeroSerie.Text == string.Empty || txtNumeroSerie.Text == null)
            {
                MessageBox.Show("Campo Número de serie vacio, debe ingresar un número de serie", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            else
                res = true;
            if (Stock.Instancia.ExisteNumeroDeSerie(txtNumeroSerie.Text) && Comp == null)
            {
                MessageBox.Show("Número de serie duplicado", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            else
                res = true;
            if (Stock.Instancia.ExisteModelo(txtModelo.Text) && Comp == null)
            {
                MessageBox.Show("Modelo duplicado", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            else
                res = true;   
            if (cmbMedio.SelectedValue != null)
                res = true;
            else 
            {
                MessageBox.Show("Debe seleccionar un medio", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return res;
        }        
        /// <summary>
        /// Evento que selecciona el medio y despliega los campos correspondientes
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>        
        private void cmbMedio_SelectedIndexChanged(object sender, EventArgs e)
        {
            MedioComponente medio;
            if (!_Inicio)
            {
                try
                {
                    Enum.TryParse<MedioComponente>(cmbMedio.SelectedValue.ToString(), out medio);
                    switch (medio)
                    {
                        case MedioComponente.Acuatico:
                            txtTemperatura.Enabled = false;
                            txtProfundidad.Enabled = true;
                            txtAltitud.Enabled = false;
                            txtVelocidad.Enabled = false;
                            break;
                        case MedioComponente.Terrestre:
                            txtProfundidad.Enabled = false;
                            txtTemperatura.Enabled = true;
                            txtAltitud.Enabled = false;
                            txtVelocidad.Enabled = false;
                            break;
                        case MedioComponente.Aereo:
                            txtProfundidad.Enabled = false;
                            txtTemperatura.Enabled = false;
                            txtAltitud.Enabled = true;
                            txtVelocidad.Enabled = true;
                            break;
                        default:
                            break;
                    }
                }
                catch (Exception)
                { }
            }
        }
    }
}
